/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gruppenkalenderProjekt.kalenderinterface;

import gruppenkalenderProjekt.data.Kategorie;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.MutableComboBoxModel;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import layout.TableLayout;

/**
 *
 * @author Gruppe 2
 */
class Kategorieanlage implements ActionListener {

    // Interfaceclient starten bzw. Verbindung zur Verwaltung herstellen
    private InterfaceClient ic;
    // Strings initiieren
    private static String frameString = "Gruppenkalender";
    private static String bestehendeKategoriebezeichnungString = "Kategorie auswählen";
    private static String kategoriebezeichnungString = "Bezeichnung der Kategorie";
    private static String kategoriefarbeString = "Farbe der Kategorie";
    private static String speichernButtonString = "Speichern";
    private static String abbrechenButtonString = "Schließen";
    private static String neuButtonString = "Neu";
    private static String loeschenButtonString = "Löschen";
    //Labels, Textfelder und Buttons initiieren
    final JLabel kategoriebezeichnung = new JLabel(kategoriebezeichnungString);
    final JLabel kategoriefarbe = new JLabel(kategoriefarbeString);
    final JLabel kategorieAuswahl = new JLabel(bestehendeKategoriebezeichnungString);
    final JButton speichernButton = new JButton(speichernButtonString);
    final JButton abbrechenButton = new JButton(abbrechenButtonString);
    final JButton neuButton = new JButton(neuButtonString);
    final JButton loeschenButton = new JButton(loeschenButtonString);
    final JTextField kategorienameTextField = new JTextField();
    final JComboBox kategorieComboBox = new JComboBox();
    final JColorChooser kategorieColorChooser = new JColorChooser();
    JFrame frame = new JFrame(frameString);
    private Vector<Kategorie> alleKategorien;
    private Kategorie aktuelleKategorie = null;

    public JPanel generateComponents(GruppenkalenderInterface gki) throws RemoteException {
        ic = gki.getIC();
        alleKategorien = ic.getAlleKategorien();

        // Layout und Container initiieren
        Container contentPane = frame.getContentPane();
        BorderLayout layout = new BorderLayout();
        contentPane.setLayout(layout);

        JPanel big = new JPanel(new BorderLayout());
        big.setBorder(
                BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Kategorie bearbeiten"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));

        // Panels
        double sizeInhalt[][] = {{65, 622}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
            {90, 245}};

        JPanel inhalt = new JPanel(new TableLayout(sizeInhalt));

        double sizeTexfieldUndDropdown[][] = {{150, 15, 420}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
            {30, 10, 30, 10, 110}};

        JPanel texfieldUndDropdown = new JPanel(new TableLayout(sizeTexfieldUndDropdown));
        texfieldUndDropdown.setBorder(
                BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Kategorie auswählen / neu anlegen"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));

        // Entferne Vorschaupanel und andere Chooserpanel
        kategorieColorChooser.setPreviewPanel(new JPanel());
        AbstractColorChooserPanel[] oldPanels = kategorieColorChooser.getChooserPanels();

        for (int i = 1; i < oldPanels.length; i++) {
            if (oldPanels[i] != null) {
                kategorieColorChooser.removeChooserPanel(oldPanels[i]);
            }
        }

        // Buttons
        double sizeButtons[][] = {{310, 100, 10, 100, 10, 100, 10, 100}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
            {130, 25}};           // Rows                 Höhe jeder Zeile (35=Buttongröße, 15=Leerzeile)

        JPanel bottom = new JPanel(new TableLayout(sizeButtons));

        texfieldUndDropdown.add(kategorieAuswahl, "0,0");
        texfieldUndDropdown.add(kategorieComboBox, "2,0");
        texfieldUndDropdown.add(kategoriebezeichnung, "0,2");
        texfieldUndDropdown.add(kategorienameTextField, "2,2");
        texfieldUndDropdown.add(kategoriefarbe, "0,4");
        texfieldUndDropdown.add(kategorieColorChooser, "2,4");


        //OnButtonClick
        kategorieComboBox.addActionListener(this);
        kategorieComboBox.setActionCommand("LeseAus");
        //OnButtonClick
        neuButton.addActionListener(this);
        neuButton.setActionCommand("Neu");
        //OnButtonClick
        speichernButton.addActionListener(this);
        speichernButton.setActionCommand("Speichern");
        //OnButtonClick
        loeschenButton.addActionListener(this);
        loeschenButton.setActionCommand("Löschen");
        //OnButtonClick
        abbrechenButton.addActionListener(gki);
        abbrechenButton.setActionCommand("Abbrechen");


        bottom.add(neuButton, "1,1");
        bottom.add(speichernButton, "3,1");
        bottom.add(loeschenButton, "5,1");
        bottom.add(abbrechenButton, "7,1");

        inhalt.add(texfieldUndDropdown, "1,1");
        big.add(inhalt, BorderLayout.NORTH);
        big.add(bottom, BorderLayout.PAGE_END);

        this.setDropdownMenuForKategorie();

        contentPane.add(big);
        return (JPanel) contentPane;

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getActionCommand().equals("LeseAus")) {
            try {
                this.setKategorieUndFarbe();
            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        if (e.getActionCommand().equals("Neu")) {
            try {
                this.leereAlleFelder();
            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        if (e.getActionCommand().equals("Speichern")) {
            try {
                if (aktuelleKategorie != null) {

                    this.speichereAktuelleKategorie();


                } else {
                    this.neueKategorieAnlegen();
                }

            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        if (e.getActionCommand().equals("Löschen")) {
            try {
                if (aktuelleKategorie != null) {
                    this.kategorieLoeschen();

                } else {
                    String message = (String) (("Bitte wählen Sie eine Kategorie aus"));
                    JOptionPane.showMessageDialog(null, message, "Löschen nicht erfolgreich", 2, null);
                }

            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void setDropdownMenuForKategorie() {
        if (kategorieComboBox.getItemCount() != 0) {
            kategorieComboBox.removeAllItems();
        }
        alleKategorien = ic.getAlleKategorien();

        kategorieComboBox.addItem("Kategorie auswählen");
        for (int i = 0; i < alleKategorien.size(); i++) {
            try {
                kategorieComboBox.addItem(alleKategorien.elementAt(i).getBezeichnung());
            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        kategorieComboBox.addActionListener(this);
    }

    public void setKategorieUndFarbe() throws RemoteException {
        String tempKategoriename = kategorieComboBox.getSelectedItem().toString();
        for (int i = 0; i < alleKategorien.size(); i++) {
            if (alleKategorien.elementAt(i).getBezeichnung().equals(tempKategoriename)) {
                kategorienameTextField.setText(tempKategoriename);
                aktuelleKategorie = alleKategorien.elementAt(i);

                kategorieColorChooser.setColor(aktuelleKategorie.getFarbe());
                System.out.println("Farbe der Kategorie aus der Datenbank: " + aktuelleKategorie.getFarbe());

                kategorienameTextField.setBackground(kategorieColorChooser.getColor());
            }
        }
    }

    public void neueKategorieAnlegen() throws RemoteException {

        //abfrage ob die Kategorie bereits existiert
        for (Kategorie k : alleKategorien) {
            if (k.getBezeichnung().toLowerCase().equals(kategorienameTextField.getText().toLowerCase())) {
                String message = (String) ("Die Kategorie: " + kategorienameTextField.getText() + " existiert bereits, geben sie eine andere Kategorie-Bezeichnung an.");
                JOptionPane.showMessageDialog(null, message, "Fehler", 2, null);
                return;
            }
        }


        String tempString = kategorienameTextField.getText();
        Color tempColor = kategorieColorChooser.getColor();

        Kategorie tempKategorie = ic.createKategorie(tempString, tempColor);
        alleKategorien.addElement(tempKategorie);
        kategorieComboBox.addItem(tempKategorie.getBezeichnung());
        int tempIndex = 0;
        for (int i = 0; i < kategorieComboBox.getItemCount(); i++) {
            tempIndex = i;
        }
        aktuelleKategorie = tempKategorie;
        kategorieComboBox.setSelectedItem(kategorieComboBox.getItemAt(tempIndex));

        this.setKategorieUndFarbe();

    }

    public void speichereAktuelleKategorie() throws RemoteException {

        //abfrage ob die Kategorie bereits existiert
        for (Kategorie k : alleKategorien) {
            if (k.getBezeichnung().toLowerCase().equals(kategorienameTextField.getText().toLowerCase())) {
                if (!aktuelleKategorie.getBezeichnung().toLowerCase().equals(kategorienameTextField.getText().toLowerCase())) {
                    String message = (String) ("Die Kategorie: " + kategorienameTextField.getText() + " existiert bereits, geben sie eine andere Kategorie-Bezeichnung an.");
                    JOptionPane.showMessageDialog(null, message, "Fehler", 2, null);
                    return;
                }

            }
        }


       aktuelleKategorie.setBezeichnung(kategorienameTextField.getText());
       aktuelleKategorie.setFarbe(kategorieColorChooser.getColor());

        //speichert den aktuellen Index
        int index = kategorieComboBox.getSelectedIndex();

        ic.updateKategorie(aktuelleKategorie);

        //geanderten Benutzer auch im Vector aktualisieren
        for (int i = 0; i < alleKategorien.size(); i++) {
            if (aktuelleKategorie.getKategorieID() == alleKategorien.elementAt(i).getKategorieID()) {
                alleKategorien.setElementAt(aktuelleKategorie, i);
            }
        }


        //Diese 3 Zeilen fügen das geänderte Objekt hinzu und löschen das Alte
        MutableComboBoxModel mcb = (MutableComboBoxModel) kategorieComboBox.getModel();
        mcb.insertElementAt(aktuelleKategorie.getBezeichnung(), index);
        mcb.removeElementAt(index + 1);

       
        this.setKategorieUndFarbe();


    }

    public void kategorieLoeschen() throws RemoteException {
        
        
        
        int index = kategorieComboBox.getSelectedIndex();
        kategorienameTextField.setText("");


        ic.deleteKategorie(aktuelleKategorie);
        aktuelleKategorie = null;
        //Diese 3 Zeilen fügen das geänderte Objekt hinzu und löschen das Alte
        MutableComboBoxModel mcb = (MutableComboBoxModel) kategorieComboBox.getModel();
        mcb.removeElementAt(index);

        kategorieComboBox.setSelectedItem(kategorieComboBox.getItemAt(0));

    }

    public void leereAlleFelder() throws RemoteException {
        aktuelleKategorie = null;
        kategorienameTextField.setText("");
        kategorienameTextField.setBackground(Color.WHITE);
        kategorieComboBox.setSelectedItem(kategorieComboBox.getItemAt(0));
        kategorieColorChooser.setColor(Color.BLACK);
    }
}
